# coding=utf-8

import command

class StatusMonitor(object):
    """
    用于监视
    注意：在刷新脚本内容时，需要重启此监控进程
    """

    def __init__(self, services):
        """
        可以接收一个或多个脚本
        对于优先级为高的服务,则单独启动一个线程来检查状态
        对于优先级为中或者低的服务,则只启动一个线程来检查状态
        :param scripts: 用于检查状态的脚本
        :return:
        """
        self.serviceLifes = {}
        executor = command.LocalCommandExecutor()
        for service in services:
            life = ServiceLifecyle(service, executor)
            serviceLifes[service.id] = life
        
        self.services = services

    def run(self):
        """
        启动一个线程监控服务的状态,当发现有服务状态不对,就记录此次事件,并且尝试重启此服务.
        :return:
        """
        for sid in serviceLifes:
            life = serviceLifes.get(sid)
            running = life.status()
            if not running:
                # 如果服务没有运行，那么向上通知汇报, 并且尝试重启
                event = Event(sid, EventType.STOP)
                EventNotify.publish(event)
                
                life.start()
